package com.pe.pgn.clubpgn.dao.impl;

import java.util.Calendar;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.FlotaDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpdFlota;
import com.pe.pgn.clubpgn.domain.ClprFlotaVehiculo;
import com.pe.pgn.clubpgn.domain.beans.BNFlota;

@Repository("flotaDao")
public class FlotaDaoImpl extends GenericDaoHibernate<ClpdFlota, Long> implements FlotaDao {

	public FlotaDaoImpl(){
		super(ClpdFlota.class);
	}

	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}	
	
	public void eliminarFlota(Long id) {
		StringBuffer query = new StringBuffer();
		StringBuffer queryTarjetasEliminar = new StringBuffer();
		
		queryTarjetasEliminar.append("select fv.id  ");
		queryTarjetasEliminar.append("from clpr_flota_vehiculo fv ");
		queryTarjetasEliminar.append(" where ");
		queryTarjetasEliminar.append(" fv.co_flota= ").append(id);
		System.out.println(queryTarjetasEliminar.toString());
		
		query.append(" update clpd_flota ");
		query.append(" set ");
		query.append(" 		st_flota  = '").append(CLPConstantes.ST_FALSO).append("' ,");
		query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
		query.append(" 		da_fecha_modificacion = sysdate ");
		query.append(" where ");
		query.append(" id= ").append(id);
		
		System.out.println(query.toString());

		int iEliminaFlota = jdbcTemplate.update(query.toString());
		
		if (iEliminaFlota>0){

			
			query = new StringBuffer();
			query.append(" update clpr_flota_vehiculo fv ");
			query.append(" set ");
			query.append(" 		fv.st_flota_vehiculo  = '").append(CLPConstantes.ST_FALSO).append("' ,");
			query.append(" 		fv.co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
			query.append(" 		fv.da_fecha_modificacion = sysdate ");
			query.append(" where ");
			query.append(" fv.id in ( ").append(queryTarjetasEliminar.toString()).append(" )") ;

			System.out.println(query.toString());			
			jdbcTemplate.update(query.toString());
			
			query = new StringBuffer();
			query.append(" update clpb_tarjeta_empresa te ");
			query.append(" set ");
			query.append(" 		te.st_tarjeta_empresa  = '").append(CLPConstantes.ST_FALSO).append("' ,");
			query.append(" 		te.co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
			query.append(" 		te.da_fecha_modificacion = sysdate ");
			query.append(" where  ");
			query.append("  te.co_flota_vehiculo in (").append(queryTarjetasEliminar).append(" )");
			System.out.println(query.toString());			
			jdbcTemplate.update(query.toString());
		}		
		getHibernateTemplate().flush();	
	}

	
	public void guardarFlota(ClpdFlota flota) {
		
		if(flota.getId() != null){
			
			flota.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			flota.setDaFechaModificacion(Calendar.getInstance());	
		}
		else{
			
			flota.setStFlota(Boolean.TRUE);
			flota.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			flota.setDaFechaCreacion(Calendar.getInstance());			
		}
		
		getHibernateTemplate().saveOrUpdate(flota);
		getHibernateTemplate().flush();
	}
	
	@SuppressWarnings("unchecked")
	public ClpdFlota obtenerFlota(Long id) {
		
		ClpdFlota flota = get(id);
		
		StringBuffer query = new StringBuffer();
		query.append("select fv.id as id, ");
		query.append("		fv.co_flota as coFlota, ");
		query.append("		fv.de_placa as dePlaca, ");
		query.append("		te.co_codigo_tarjeta_empresa as deTarjetaEmpresa, ");
		query.append(" 		to_char(fv.da_fecha_inscripcion,'"+CLPConstantes.DATE_PATTERN+"') as fechaInscripcion, ");
		query.append("		te.de_observaciones as deObservaciones ");
		query.append("	from clpr_flota_vehiculo fv join clpb_tarjeta_empresa te on te.id = fv.co_tarjeta_empresa ");
		query.append("	where fv.co_flota =  ").append(flota.getId());
		
		if (flota.isStFlota()) {
			query.append("	and fv.st_flota_vehiculo =  '").append(CLPConstantes.ST_VERDADERO).append("'");
		}
		
		query.append(" order by fv.id desc ");
		List<ClprFlotaVehiculo> listaFV = findListOfBeans(query.toString(), null, ClprFlotaVehiculo.class);
		
		if (!listaFV.isEmpty()){
			flota.setFlotaVehiculos(listaFV);
		} 
		return flota;
	}

	@SuppressWarnings("unchecked")	
	public List<BNFlota> obtenerFlotas(BNFlota flota, boolean esInicial) {
		
		StringBuffer query = new StringBuffer();
		query.append("select f.id as id, ");
		query.append("		f.de_flota_area as deFlotaArea, ");
		query.append("		ce.de_cliente_empresa as deClienteEmpresa, ");
		query.append("		ce.co_ruc as coRuc, ");
		query.append("		f.st_flota as stFlota ");
		query.append("	from clpd_flota f join clpb_cliente_empresa ce on f.co_cliente_empresa = ce.id ");
		query.append("	where 1 = 1 ");
		
		if(!esInicial){
			
			if(StringUtils.isNotBlank(flota.getDeClienteEmpresa())){
				
				query.append("		and upper(trim(ce.de_cliente_empresa)) like '%")
				.append(flota.getDeClienteEmpresa().trim().toUpperCase()).append("%' ");
			}
			
			if(StringUtils.isNotBlank(flota.getDeFlotaArea())){
				
				query.append("		and  upper(trim(f.de_flota_area)) like '%")
				.append(flota.getDeFlotaArea().trim().toUpperCase()).append("%' ");
			}
			
			if(StringUtils.isNotBlank(flota.getCoRuc())){
				
				query.append("		and ce.co_ruc like '%").append(flota.getCoRuc().trim()).append("%'");
			}
			
			if(StringUtils.isNotBlank(flota.getStFlota()) 
					&& !flota.getStFlota().equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS)){
				query.append("		and f.st_flota = '").append(flota.getStFlota()).append("' ");
			}
			
			query.append(" order by f.id desc ");
		}
		else{
			
			StringBuffer sql = new StringBuffer();
			
			sql.append(" select * from (").append(query.toString()).append(") slct where rownum <= ")
			.append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
			sql.append(" order by slct.id desc ");
			
			query = new StringBuffer(sql.toString());
		}

		List lista = findListOfBeans(query.toString(), null, BNFlota.class);			
		return lista;
	}


	@Override
	public Long validaFlota(String deFlotaArea, Long idFlota) {

		StringBuffer sql = new StringBuffer();
		Long resultado = null;
		
			sql.append(" select count(id) from clpd_flota ");
			sql.append(" where de_flota_area ='").append(deFlotaArea).append("' ");
			
			if (null !=idFlota){
				sql.append(" and id <>").append(idFlota);
			} 
			
			resultado = jdbcTemplate.queryForLong(sql.toString());
		return resultado;
	}

	public ClpdFlota obtenerFlotaByID(Long id){
		return get(id);
	}

	public String obtenerFlotaAreaByID(Long flotaID) {

		StringBuffer query = new StringBuffer();
		query.append(" select de_flota_area ");
		query.append(" from clpd_flota ");
		query.append(" where id = ").append(flotaID);
		Map<String,Object> map = jdbcTemplate.queryForMap(query.toString());
		
		if(map.get("de_flota_area") != null){
			return map.get("de_flota_area").toString();
		}
		
		return "";
	}
}